home *** CD-ROM | disk | FTP | other *** search
- #include <ctype.h>
-
- /* Some non-standard macros that the MiNTlibs' ctype.h defines */
- #ifndef isodigit
- #define isodigit(c) ( (c)>='0' && (c)<='7' )
- #endif
- #ifndef toint
- #define toint(c) ( (c) <= '9' ? (c) - '0' : toupper(c) - 'A' + 10)
- #endif
-
- char *ctlcnv(char *string)
- {
- register char *s = string, *t = string;
- register char c;
- register int val;
-
- for (;;) {
- if (*t == '\0') {
- *s = '\0';
- return string;
- } else if (*t != '\\') {
- *s++ = *t++;
- } else if (++t, isodigit(*t)) {
- val = *t++ - '0';
- if (isodigit(*t)) {
- val = (val << 3) + *t++ - '0';
- if (isodigit(*t))
- val = (val << 3) + *t++ - '0';
- }
- *s++ = (char)val;
- } else switch (c = *t++) {
- case 'n':
- *s++ = '\n';
- break;
- case 't':
- *s++ = '\t';
- break;
- case 'v':
- *s++ = '\v';
- break;
- case 'b':
- *s++ = '\b';
- break;
- case 'r':
- *s++ = '\r';
- break;
- case 'f':
- *s++ = '\f';
- break;
- case 'a':
- *s++ = '\a';
- break;
- case '\\':
- *s++ = '\\';
- break;
- case '?':
- *s++ = '?';
- break;
- case '\'':
- *s++ = '\'';
- break;
- case '\"':
- *s++ = '\"';
- break;
- case '\n':
- break;
- case 'x':
- val = 0;
- while (c = *t++, isxdigit(c))
- val = (val << 4) + toint(c);
- t--;
- *s++ = (char)val;
- break;
- default:
- *s++ = '\\';
- *s++ = c;
- break;
- }
- }
- }
-